"""
资源监控工具 - 主程序
Windows系统资源监控小工具，显示CPU、内存和网络使用情况
支持窗口模式和系统托盘模式
"""

import tkinter as tk
import sys
import traceback
import os
import json
from main_window import ResourceMonitorApp
from tray_app import SystemTrayApp
from taskbar_display import TaskbarDisplay

def get_application_path():
    """获取应用程序路径，支持PyInstaller打包
    
    Returns:
        str: 应用程序所在目录路径
    """
    if getattr(sys, 'frozen', False):
        # 如果是PyInstaller打包的exe文件
        return os.path.dirname(sys.executable)
    else:
        # 如果是Python脚本运行
        return os.path.dirname(os.path.abspath(__file__))

def load_simple_config():
    """加载简单配置，用于纯任务栏模式
    
    Returns:
        dict: 配置字典
    """
    config_file = os.path.join(get_application_path(), "config.json")
    default_config = {
        "show_in_taskbar": True,
        "taskbar_window": {
            "x": None,
            "y": None,
            "width": 120,
            "height": 25
        }
    }
    
    try:
        if os.path.exists(config_file):
            with open(config_file, "r", encoding="utf-8") as f:
                loaded_config = json.load(f)
                if isinstance(loaded_config, dict):
                    # 合并配置，确保向后兼容性
                    if "taskbar_window" not in loaded_config:
                        loaded_config["taskbar_window"] = default_config["taskbar_window"]
                    default_config.update(loaded_config)
                    print(f"已加载配置: {default_config}")
        else:
            print(f"配置文件不存在，使用默认配置: {config_file}")
    except Exception as e:
        print(f"加载配置时出错: {e}")
        traceback.print_exc()
    
    return default_config

def save_simple_config(config):
    """保存简单配置，用于纯任务栏模式
    
    Args:
        config (dict): 要保存的配置
    """
    config_file = os.path.join(get_application_path(), "config.json")
    try:
        with open(config_file, "w", encoding="utf-8") as f:
            json.dump(config, f, ensure_ascii=False, indent=4)
        print(f"配置已保存到: {config_file}")
    except Exception as e:
        print(f"保存配置时出错: {e}")
        traceback.print_exc()

def position_window_bottom_right(root):
    """将窗口定位到屏幕右下角"""
    # 获取屏幕尺寸
    screen_width = root.winfo_screenwidth()
    screen_height = root.winfo_screenheight()
    
    # 获取窗口尺寸
    root.update_idletasks()  # 确保窗口尺寸更新
    window_width = root.winfo_width()
    window_height = root.winfo_height()
    
    # 防止窗口尺寸为0
    if window_width <= 1 or window_height <= 1:
        window_width = 300
        window_height = 200
    
    # 计算右下角坐标 (考虑任务栏空间，留出一些边距)
    x = screen_width - window_width - 20
    y = screen_height - window_height - 60
    
    # 设置窗口位置
    root.geometry(f"{window_width}x{window_height}+{x}+{y}")
    print(f"窗口位置已设置: {window_width}x{window_height}+{x}+{y}")

def run_window_mode():
    """以窗口模式运行应用"""
    try:
        print("启动窗口模式")
        # 创建主窗口
        root = tk.Tk()
        app = ResourceMonitorApp(root)
        
        # 将窗口放置在屏幕右下角
        position_window_bottom_right(root)
        
        # 确保窗口尺寸正确
        root.update_idletasks()
        
        # 启动主循环
        print("开始主循环")
        root.mainloop()
        print("窗口模式已退出")
    except Exception as e:
        print(f"启动窗口模式时发生错误: {e}")
        traceback.print_exc()

def run_taskbar_only_mode():
    """仅在任务栏显示信息模式"""
    try:
        print("启动纯任务栏模式")
        
        # 加载配置
        config = load_simple_config()
        taskbar_config = config.get("taskbar_window", {})
        
        # 位置变化回调函数
        def on_position_changed(position):
            try:
                config["taskbar_window"] = position
                save_simple_config(config)
                print(f"任务栏位置已更新: {position}")
            except Exception as e:
                print(f"保存位置时出错: {e}")
        
        # 创建任务栏显示，传入配置和回调
        taskbar_display = TaskbarDisplay(
            window_config=taskbar_config,
            position_callback=on_position_changed
        )
        
        # 立即显示任务栏窗口
        taskbar_display.show()
        
        # 添加退出功能
        root = tk.Tk()
        root.withdraw()
        
        # 确保用户可以通过Alt+F4关闭程序
        def on_exit():
            # 保存最终位置
            try:
                final_position = taskbar_display.get_current_position()
                if final_position:
                    config["taskbar_window"] = final_position
                    save_simple_config(config)
                    print(f"程序退出时保存位置: {final_position}")
            except Exception as e:
                print(f"退出时保存位置失败: {e}")
            
            taskbar_display.shutdown()
            root.destroy()
        
        root.protocol("WM_DELETE_WINDOW", on_exit)
        
        # 开始主循环
        try:
            root.mainloop()
        except KeyboardInterrupt:
            on_exit()
            
        print("纯任务栏模式已退出")
    except Exception as e:
        print(f"启动纯任务栏模式时发生错误: {e}")
        traceback.print_exc()

def run_tray_mode():
    """以系统托盘模式运行应用"""
    try:
        print("启动托盘模式")
        # 创建系统托盘应用
        tray_app = SystemTrayApp()
        
        # 运行托盘应用
        tray_app.run()
        print("托盘模式已退出")
    except Exception as e:
        print(f"启动托盘模式时发生错误: {e}")
        traceback.print_exc()
        # 如果托盘模式启动失败，回退到窗口模式
        print("尝试回退到窗口模式")
        run_window_mode()

def print_help():
    """打印帮助信息"""
    print("资源监控工具 - 使用说明")
    print("命令行参数:")
    print("  --window     以窗口模式运行，不创建托盘图标")
    print("  --taskbar    仅在任务栏显示CPU和内存信息")
    print("  --help       显示此帮助信息")
    print("")
    print("默认模式: 托盘模式，包含托盘图标和任务栏显示")

def main():
    """程序入口点"""
    # 解析命令行参数
    use_tray_mode = True
    use_taskbar_only = False
    
    # 检查命令行参数
    if len(sys.argv) > 1:
        if sys.argv[1] == "--window":
            use_tray_mode = False
            use_taskbar_only = False
            print("检测到 --window 参数，将以窗口模式启动")
        elif sys.argv[1] == "--taskbar":
            use_tray_mode = False
            use_taskbar_only = True
            print("检测到 --taskbar 参数，将以纯任务栏模式启动")
        elif sys.argv[1] == "--help" or sys.argv[1] == "-h":
            print_help()
            return
        else:
            print(f"未知参数: {sys.argv[1]}")
            print_help()
            return
    else:
        print("未检测到命令行参数，将以托盘模式启动")
    
    # 根据模式运行程序
    if use_taskbar_only:
        run_taskbar_only_mode()
    elif use_tray_mode:
        run_tray_mode()
    else:
        run_window_mode()

if __name__ == "__main__":
    try:
        main()
    except Exception as e:
        print(f"程序运行出错: {e}")
        traceback.print_exc() 